package com.sheep.jucdemo.part2.part2_10;

/**
 * 2.10  J a v a指令重排序
 * J a v a内存模型允许编译器和处理器对指令重排以提高行性能，
 * 并且只会对不存在数据依赖性的指令重排序。在单线程下重排序可以保证最终执行的结果与程序顺序执行的结果一致，
 * 是在多线程下就存在问题。下面看个例子。工nta  =  l ;  (1)工ntb  =  2 ; (2 )工ntc=  a + b ; (3 )在如上代码中，
 * 变量c的值依赖a和b的值，
 * 所以重排序能够保证（3）的操作在（2)(1）之后，
 * 但是（1)(2）谁先执行就不一定了，
 * 这在线程下不会存在问题，
 * 因为并不影响最终结果。下面看个多线的例子。
 * @Date 2022/4/13 22:20
 * @Created by sheep
 */
public class Test2_10_1 {

    private static int num = 0;
    private static volatile boolean ready = false;

    public static class ReadThread extends Thread {
        @Override
        public void run() {
            while (!Thread.currentThread().isInterrupted()) {
                if (ready) {//(1)
                    System.out.println(num + num);//(2)
                }

            }
        }
    }

    public static class WriteThread extends Thread {
        @Override
        public void run() {
            num = 2;//(3)
            ready = true;//(4)
            System.out.println("writeThread set over...");
        }
    }

    public static void main(String[] args) throws InterruptedException {
        ReadThread rt = new ReadThread();
        rt.start();

        WriteThread wt = new WriteThread();
        wt.start();

        Thread.sleep(10);
        rt.interrupt();
        System.out.println("manin exit");
    }
}
